/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * ProcessadorPanel.java
 *
 * Created on 07/09/2009, 22:31:06
 */
package interpretadorportugolvisual.panels;

import interpretadorportugolvisual.partes.Processador;
import br.org.isvi.interpretador.portugol.InterpreterResolver;
import interpretadorportugolvisual.partes.BarramentoProcessador;
import interpretadorportugolvisual.partes.Memoria;
import interpretadorportugolvisual.partes.SetaLeEntrada;
import interpretadorportugolvisual.partes.SetaDireita;
import interpretadorportugolvisual.partes.SetaEsquerda;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JTextField;

/**
 *
 * @author abraaoisvioliveirasouzadocarmo
 */
public class ProcessadorPanel extends javax.swing.JPanel implements ViewResolver, KeyListener {

    private Processador processador;
    private Memoria memoria;
    private SetaEsquerda setaEscreveMemoria;
    private SetaDireita  setaLeMemoria;
    private SetaDireita  setaEscreveSaida;
    private SetaLeEntrada setaLeEntrada;
    private BarramentoProcessador barramentoProcessador;
    private JTextField entrada;
    
    
    /** Creates new form ProcessadorPanel */
    public ProcessadorPanel(JTextField entrada) {
        initComponents();
        processador = new Processador();
        memoria = new Memoria();
        this.entrada = entrada;

        setaEscreveMemoria = new SetaEsquerda(220, 370);
        setaLeMemoria = new SetaDireita(220, 430);
        setaEscreveSaida = new SetaDireita(540, 410);
        setaLeEntrada = new SetaLeEntrada(430, 455);
        barramentoProcessador = new BarramentoProcessador(328, 10, 350);
        entrada.addKeyListener(this);

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(interpretadorportugolvisual.InterpretadorPortugolVisualApp.class).getContext().getResourceMap(ProcessadorPanel.class);
        setBackground(resourceMap.getColor("Form.background")); // NOI18N
        setMaximumSize(new java.awt.Dimension(401, 565));
        setMinimumSize(new java.awt.Dimension(401, 565));
        setName("Form"); // NOI18N
        setPreferredSize(new java.awt.Dimension(401, 565));

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 833, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 613, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        processador.desenhar(g, 328, 350);
        memoria.desenhar(g, 10, 50);

        setaEscreveMemoria.desenhar(g);
        setaLeMemoria.desenhar(g);
        setaEscreveSaida.desenhar(g);
        setaLeEntrada.desenhar(g);
        barramentoProcessador.desenhar(g);
    }

    public void startPaintThread() {
        new Thread() {

            @Override
            public void run() {
                while (true) {
                    ProcessadorPanel.this.repaint();
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException ex) {
                        InterpreterResolver.instance.performeHandlingError("ERRO INTERNO! CASUADO>" + ex.getCause(), 0, 0);
                    }
                }
            }
        }.start();
    }

    public Processador getProcessador() {
        return processador;
    }

    public Memoria getMemoria() {
        return memoria;
    }

    public BarramentoProcessador getBarramento() {
        return barramentoProcessador;
    }

    public SetaLeEntrada getSetaEntrada() {
        return setaLeEntrada;
    }

    public SetaEsquerda getSetaEscreveMemoria() {
        return setaEscreveMemoria;
    }

    public SetaDireita getSetaLeMemoria() {
        return setaLeMemoria;
    }

    public SetaDireita getEscreveSaida() {
        return setaEscreveSaida;
    }

    public String getTextoEntrada() {
        String ret = entrada.getText();
        entrada.setText("");

        return ret;
    }

    public void keyTyped(KeyEvent arg0) {

    }

    public void keyPressed(KeyEvent arg0) {

    }

    public void keyReleased(KeyEvent ev) {
        if(ev.getKeyCode() == KeyEvent.VK_ENTER) {
            if(getSetaEntrada().isBusy()) {
                getSetaEntrada().setRecebendo();
            }
        }
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
